package com.freemarker;

import java.io.BufferedWriter;
import java.io.StringWriter;
import java.io.Writer;

import freemarker.template.Template;

/**
 * <p>
 * 操作模板的工具，可以利用模板和数据来产生特定的输出。
 * </p>
 * @author  tom.fan
 *
 */
public class TemplateUtil {

    private final static String STATICPAGE_PATH = "/templates/staticPage";

    /**
     * <p>
     * 获取staticPage, 可以根据模板＋数据来产生。
     * </p>
     * <p>
     * 目前使用的是 <i>Freemarker</i> 模板框架来实现模板处理。
     * </p>
     * <p>
     * 使用注意：
     * <li> 为统一管理模板文件，请在添加新模板文件时，在<code>StaticPageConstant</code>中添加文件名常量， 以后可以通过使用该常量来调用模板。
     * <li> 模板名不要加路径，只是文件名即可。
     * <li> staticPage的模板文件目前保存于 classpath中，位于/templates/staticPage，常量为 <code>TemplateUtil.STATICPAGE_PATH/code>
     * <li> 模板文件的命名以.ftl结尾，名字规则建议为： ["staticPage" + "_" + 模块名]。例如: staticPage_profile.ftl
     * <li> 模板文件目前全部使用 UTF-8编码，这点要注意.
     * </p>
     * 
     * @param tempName
     *            模板文件的文件名，不要加路径
     * @param dataMap
     *            封装的数据，一般指定为<code>java.util.Map</code>或java bean等
     * @return 将模板和数据组装成String
     * @throws Exception
     */
    public static String generateContent(String tempName, Object dataMap) throws Exception {
        Template temp = FreemarkerConfiguration.getInstance().getTemplate(STATICPAGE_PATH, tempName);
        String str = null;
        Writer w = null;
        try {
            Writer sw = new StringWriter();
            w = new BufferedWriter(sw);
            temp.process(dataMap, w);
            str = sw.toString();
        } finally {
            if (w != null) {
                w.close();
            }
        }
        return str;
    }

}
